package org.pb.pet.controller;

import org.pb.basic.utils.AjaxResult;
import org.pb.basic.utils.PageList;
import org.pb.pet.domain.Pet;
import org.pb.pet.domain.PetDetail;
import org.pb.pet.query.PetQuery;
import org.pb.pet.service.IPetDetailService;
import org.pb.pet.service.IPetService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Api(tags = "宠物接口",description = "宠物接口详细描述")
@RestController
@RequestMapping("/pet")
public class PetController {

    @Autowired
    private IPetService petService;

    @Autowired
    private IPetDetailService petDetailService;

    //获取一个对象：get
    //@GetMapping相当于@RequestMapping(value="/xxx",method=RequestMethod.GET)
    //Get http://localhost:8080/pet/1
    @ApiOperation(value = "查询单个宠物",notes = "需要传递id")
    @GetMapping("/{id}")//  pet/1    或 /pet/2
    public Pet findById(@PathVariable("id")Long id){
        return petService.getById(id);
    }


    //获取所有对象：get
    //Get http://localhost:8080/pet
    @ApiOperation(value = "查询所有",notes = "不需参数")
    @GetMapping
    public List<Pet> findAll(){
        return petService.findAll();
    }


    //分页 + 高级：post - 直接写，后面发送异步请求时再说
    //请求数据包中：请求行 + 请求头 + 请求体【参数就在请求体中】
    //Post http://localhost:8080/pet + json参数petQuery
    @ApiOperation(value = "分页查询宠物信息",notes = "需要传递当前页和每页显示的条数")
    @PostMapping
    public PageList<Pet> findPage(@RequestBody PetQuery petQuery){
        return petService.findByQuery(petQuery);
    }

    /**
     * 根据传入的pet参数中是否有id值，完成添加或者修改
     * @param pet 要添加或者修改的id值
     * @return 返回处理结果
     */
    @PutMapping
    public AjaxResult saveOrUpdate(@RequestBody Pet pet, HttpServletRequest request) {
        try {
            // 判断pet中是够没有id
            if (pet.getId() == null) {
                // 如果没有id，表示这是一个新增命令
                petService.save(pet, request);
            } else {
                // 如果有id表示这是一个修改命令
                petService.update(pet);
            }
            // 如果没有出现异常，就表示保存成功
            return AjaxResult.successWithMessage("保存成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果出现了异常，就表示保存失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 根据传入的id，删除指定的pet信息，并同步删除对应的detail宠物明细信息
     * @param id 要删除的宠物信息
     * @return 删除处理结果
     */
    @DeleteMapping("/{id}")
    public AjaxResult remove(@PathVariable("id") Long id) {
        try {
            // 执行删除命令
            petService.remove(id);
            // 如果没有出现异常表示删除成功
            return AjaxResult.successWithMessage("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果出现了异常，表示删除失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    @GetMapping("/detail/{id}")
    public AjaxResult getDetail(@PathVariable("id") Long id) {
        try {
            // 执行宠物明细的查询命令
            PetDetail detail = petDetailService.getByPetId(id);
            // 如果没有发生异常，表示查询成功
            return AjaxResult.successWithData(detail);
        } catch (Exception e) {
            e.printStackTrace();
            // 如果出现异常，表示查询失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 根据id集合删除对应多个宠物信息，并同步删除对应的宠物明细信息
     * @param ids 要删除的宠物id集合
     * @return 返回批量删除结果
     */
    @PatchMapping
    public AjaxResult batchRemove(@RequestBody List<Long> ids) {
        try {
            // 执行批量删除结果
            petService.batchRemove(ids);
            // 如果没有出现异常表示删除成功
            return AjaxResult.successWithMessage("批量操作成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果抛出异常表示批量删除失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 宠物上架的功能接口
     * @param ids 要上架的宠物id集合
     * @return 返回上架处理结果
     */
    @PostMapping("/onsale")
    public AjaxResult onSalePet(@RequestBody List<Long> ids) {
        try {
            // 执行批量上架操作
            petService.onSale(ids);
            // 如果没有出现异常表示上架成功
            return AjaxResult.successWithMessage("上架成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果出现了异常表示上架失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 宠物下架的功能接口
     * @param ids 要下架的宠物id集合
     * @return 返回下架处理结果
     */
    @PostMapping("/offsale")
    public AjaxResult offSalePet(@RequestBody List<Long> ids) {
        try {
            // 执行批量上架操作
            petService.offSale(ids);
            // 如果没有出现异常表示上架成功
            return AjaxResult.successWithMessage("上架成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果出现了异常表示上架失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 领养宠物接口
     * @param pet 被领养宠物的id
     * @return 返回领养结果
     */
    @PostMapping("/adopt")
    public AjaxResult adopt(HttpServletRequest request, @RequestBody Pet pet) {
        try {
            // 执行领养宠物命令
            petService.adopt(pet.getId(), request);
            // 如果没有出现异常表示领养成功
            return AjaxResult.successWithMessage("领养成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果出现了异常表示领养失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

}
